package com.twj.tools.img;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Base64;

/**
 * @author 作者: tianwenju
 * @version 1.0
 * @project 金税三期工程核心征管及应用总集成项目
 * @package com.css.dsjypt.sjd.common.utils
 * @file ImageUtil.java 创建时间:2023年06月28日 11:09
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2020 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @reviewer 审核人:
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 */
public class ImageUtil {

    /**
     * 图片转Base64字符串
     *
     * @param imageFileName
     * @return
     */
    public static String convertImageToBase64Str(String imageFileName) {
        ByteArrayOutputStream baos = null;
        try {
            //获取图片类型
            String suffix = imageFileName.substring(imageFileName.lastIndexOf(".") + 1);
            //构建文件
            File imageFile = new File(imageFileName);
            //通过ImageIO把文件读取成BufferedImage对象
            BufferedImage bufferedImage = ImageIO.read(imageFile);
            //构建字节数组输出流
            baos = new ByteArrayOutputStream();
            //写入流
            ImageIO.write(bufferedImage, suffix, baos);
            //通过字节数组流获取字节数组
            byte[] bytes = baos.toByteArray();
            //获取JDK8里的编码器Base64.Encoder转为base64字符
//            return Base64.getEncoder().encodeToString(bytes);
            return "data:image/" + suffix + ";base64," + Base64.getEncoder().encodeToString(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * Base64字符串转图片
     *
     * @param base64String
     * @param imageFileName
     */
    public static File convertBase64StrToImage(String base64String, String imageFileName) {
        ByteArrayInputStream bais = null;
        try {
            //获取图片类型
            String suffix = imageFileName.substring(imageFileName.lastIndexOf(".") + 1);
            //获取JDK8里的解码器Base64.Decoder,将base64字符串转为字节数组
            byte[] bytes = Base64.getDecoder().decode(base64String);
            //构建字节数组输入流
            bais = new ByteArrayInputStream(bytes);
            //通过ImageIO把字节数组输入流转为BufferedImage
            BufferedImage bufferedImage = ImageIO.read(bais);
            //构建文件
            File imageFile = new File(imageFileName);
            //写入生成文件
            ImageIO.write(bufferedImage, suffix, imageFile);
            return imageFile;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                if (bais != null) {
                    bais.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * jpg、bmp、gif、png、wbmp、jpeg
     */
    public static void testCompressImages() {
        // 输入文件路径
        String inputFilePath = "D:\\test\\pic\\系统架构师.png";
        // 输出文件路径
        String outputFilePath = "D:\\test\\pic\\系统架构师-压缩.png";

        // 创建输入和输出文件对象
        File inputFile = new File(inputFilePath); // 创建输入文件对象
        File outputFile = new File(outputFilePath); // 创建输出文件对象

        try {
            // 读取输入文件的图像
            BufferedImage originalImage = ImageIO.read(inputFile); // 使用 ImageIO.read 方法读取输入文件的图像数据


            int height = originalImage.getHeight();
            int width = originalImage.getWidth();

            // 设置压缩后的宽度和高度
            int targetWidth = 600; // 设置目标图像的宽度  word 宽度
            int targetHeight = (int) (height * ((double) targetWidth / width)); // 根据原始图像的宽高比例计算目标图像的高度
            // 创建缩小后的图像对象
            BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); // 创建一个新的缩小后的图像对象


            Graphics2D g = resizedImage.createGraphics();
            //设置渲染提示，优化图像缩放质量
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.setBackground(Color.WHITE);//设置背景色为白色
            //清除指定矩形区域，并用背景色填充（此处为白色）去黑线
            g.clearRect(0, 0, targetWidth, targetHeight);
            g.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
            g.dispose();// 释放 Graphics2D 对象

            // 写入缩小后的图像到输出文件
            ImageIO.write(resizedImage, "png", outputFile); // 使用 ImageIO.write 方法将缩小后的图像数据写入到输出文件
            System.out.println("压缩成功");

        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("压缩失败");
        }
    }
    public static void main(String[] args) {
//        testBase64();

        testCompressImages();
    }

    private static void testBase64() {
        System.out.println("----------------------------图片转Base64字符串---------------------------");
        //图片文件路径
//        String imageFileName = "D:\\test\\pic\\p.png";
        String imageFileName = "D:\\test\\pic\\b.jpg";
        //图片转Base64字符串
        String base64Str = ImageUtil.convertImageToBase64Str(imageFileName);
        System.out.println(base64Str);
//
        System.out.println("----------------------------Base64字符串转图片---------------------------");
        //新文件路径
//        String newFileName = "D:\\test\\pic\\p2.png";
        String newFileName = "D:\\test\\pic\\b2.jpg";
        String[] split = base64Str.split(",");
        System.out.println("split = " + split[0]);
        System.out.println("split = " + split[1]);

        System.out.println(split[0].substring(split[0].indexOf('/') + 1, split[0].indexOf(';')));
        //Base64字符串转图片
        ImageUtil.convertBase64StrToImage(split[1], newFileName);
        System.out.println("生成的文件的路径是：" + newFileName);
    }

}
